# -*- coding: utf-8 -*-

import math
import numpy as np

def frames2signal(frames, sampwidth):
    """
    Составляет сигнал из строки фрэймов, которую вернул Wave_read.readframes().
    
    Ожидаемый порядок байтов: little-endian
    """
    
    for i in xrange(0, len(frames), sampwidth):
        # Составляем целое число из фреймов. Некрасиво, зато быстро.
        mostSignificant = i + sampwidth - 1 # позиция старшего байта
        res = ord(frames[mostSignificant])
        for j in xrange(mostSignificant - 1, i - 1, -1):
            res <<= 8
            res |= ord(frames[j]);
        # res --- это и есть значение сигнала
        yield res

def signal2frames(sig, sampwidth):
    """
    Записывает сигнал побайтово в строку. Порядок байтов: little-endian
    """
    
    mask = 0x000000ff
    for num in sig:
        tmp = int(round(num))
        for i in xrange(sampwidth):
            yield chr(tmp & mask)
            tmp >>= 8

def treshold(sp, t, tp = 'hard'):
    """
    Применяет пороговый фильтр.
    
    Вычисления происходят на месте.
    sp: numpy.array для фильтрации
    t: порог фильтрации
    """
    
    if tp == 'hard':
        foo = lambda x: x
    elif tp == 'linear':
        foo = lambda x: np.sign(x) * (abs(x) - t)
    elif tp == 'Vidakovich':
        foo = lambda x: np.sign(x) * (x**2 - t**2)**0.5
    else:
        raise ValueError
        
    
    counter = 0
    for i in xrange(sp.size):
        if abs(sp[i]) < t:
            sp[i] = 0
            counter += 1
        else:
            sp[i] = foo(sp[i])
    return counter

def rootMeanSqr(x1, x2):
    r = np.sqrt(np.mean((x1 - x2)**2))
    return r
